home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 242 / Issue 242 - April 2008 - DPCS0408DVD.ISO / Open Source / AutoHotKey / Source / AutoHotkey104705_source.exe / source / qmath.h < prev    next >
Encoding:
C/C++ Source or Header  |  2005-10-24  |  18.2 KB  |  917 lines

  1. /* ==== ArtNouveaU Quick Math ~ qmath.h ==================================
  2.  
  3.    WATCOM C/C++ Standard Libraries replacement for tiny code.
  4.    Copyright (C) 1997 by the gang at ArtNouveaU, All Rights Reserved.
  5.  
  6.    Microsoft Visual C/C++ Standard Libraries replacement for tiny code.
  7.    Copyright (C) 2002 by Gabriele Scibilia, All Rights Reserved.
  8.  
  9.         author           : <G>SZ ~ ArtNouveaU
  10.         file creation    : 30 March 1997
  11.         file description : fast floating point math intrinsics
  12.  
  13.         revision history :
  14.             (30/03/97) the beginning
  15.             (24/10/97) renamed WATCOM C/C++ tinymath.h
  16.             (26/10/97) added sincos intrinsic
  17.             (30/10/97) added acos and asin intrinsics
  18.             (31/10/97) added ceil and floor ones
  19.             (01/11/97) added hypot, cosh, sinh, acosh, asinh atanh ones
  20.             (02/11/97) added tanh intrinsic
  21.             (09/01/98) added M_ constants
  22.             (27/08/02) renamed MS Visual C/C++ qmath.h
  23.             (11/01/04) modified qmathTan() - J.Bennett <jon@hiddensoft.com>
  24.  
  25.         references       :
  26.             ArtNouveaU Tiny Library,
  27.             tinymath WATCOM C/C++ intrinsics for math functions,
  28.             Gabriele Scibilia, 24 October 1997.
  29.  
  30.             Pascal/Cubic math intrinsics, 1997.
  31.  
  32.             WATCOM C/C++ v11.0 Math Library, 1997.
  33.  
  34.             RTLIB2 small math run time library replacement,
  35.             "Art" 64k demo by Farbrausch and Scoopex, 2001.
  36.  
  37.         notes            : pow returns NaN with non-positive arguments
  38.  
  39.                            For those who hates "naked" convention
  40.                            try modifing each function as the following
  41.                            ie.
  42.                             i- changing float loads
  43.                            ii- removing inlined "ret" statement
  44.  
  45.                            double _QMATH_LINK qmathSqrt(double __x)
  46.                            {
  47.                                __asm fld        qword ptr __x
  48.                                __asm fsqrt
  49.                            }
  50.  
  51.                            When single precision floating point support
  52.                            is required...
  53.  
  54.                            _QMATH_NAKED _QMATH_INLINE
  55.                            float _QMATH_LINK qmathSinFloat(float __x)
  56.                            {
  57.                                __asm fld       dword ptr [esp + 4]
  58.                                __asm fsin
  59.                                __asm ret       4
  60.                            }
  61.  
  62.   ======================================================================== */
  63.  
  64. #ifndef _QUICKMATH_H_INCLUDED
  65. #define _QUICKMATH_H_INCLUDED
  66.  
  67. #ifdef __cplusplus
  68. extern "C" {
  69. #endif
  70.  
  71. // Commented out in AutoHotkey v1.0.40.02 to help reduce code size:
  72. //static char quickmath_id[] = "$Id: qmath.h,v 1.1 2004/01/15 19:50:35 jonbennett Exp $";
  73.  
  74. // for silly C compilers allowing inlining
  75. // try using "static" definition otherwise
  76. #define _QMATH_INLINE __inline
  77.  
  78. // functions are emitted without prolog or epilog code
  79. #define _QMATH_NAKED  __declspec(naked)
  80.  
  81. // argument-passing right to left
  82. // called function pops its own arguments from the stack
  83. #define _QMATH_LINK   __stdcall
  84.  
  85. #define FIST_MAGIC (((65536.0 * 65536.0 * 16) + 32768.0) * 65536.0)
  86. #define FIST_M0131 (65536.0 * 24.0 * 2.0)
  87. #define FIST_M0230 (65536.0 * 24.0 * 4.0)
  88. #define FIST_M0329 (65536.0 * 24.0 * 8.0)
  89. #define FIST_M0428 (65536.0 * 24.0 * 16.0)
  90. #define FIST_M0527 (65536.0 * 24.0 * 32.0)
  91. #define FIST_M0626 (65536.0 * 24.0 * 64.0)
  92. #define FIST_M0725 (65536.0 * 24.0 * 128.0)
  93. #define FIST_M0824 (65536.0 * 24.0 * 256.0)
  94. #define FIST_M0923 (65536.0 * 24.0 * 512.0)
  95. #define FIST_M1022 (65536.0 * 24.0 * 1024.0)
  96. #define FIST_M1121 (65536.0 * 24.0 * 2048.0)
  97. #define FIST_M1220 (65536.0 * 24.0 * 4096.0)
  98. #define FIST_M1319 (65536.0 * 24.0 * 8192.0)
  99. #define FIST_M1418 (65536.0 * 24.0 * 16384.0)
  100. #define FIST_M1517 (65536.0 * 24.0 * 32768.0)
  101. #define FIST_M1616 (65536.0 * 65536.0 * 24.0 * 1.0)
  102. #define FIST_M1715 (65536.0 * 65536.0 * 24.0 * 2.0)
  103. #define FIST_M1814 (65536.0 * 65536.0 * 24.0 * 4.0)
  104. #define FIST_M1913 (65536.0 * 65536.0 * 24.0 * 8.0)
  105. #define FIST_M2012 (65536.0 * 65536.0 * 24.0 * 16.0)
  106. #define FIST_M2111 (65536.0 * 65536.0 * 24.0 * 32.0)
  107. #define FIST_M2210 (65536.0 * 65536.0 * 24.0 * 64.0)
  108. #define FIST_M2309 (65536.0 * 65536.0 * 24.0 * 128.0)
  109. #define FIST_M2408 (65536.0 * 65536.0 * 24.0 * 256.0)
  110. #define FIST_M2507 (65536.0 * 65536.0 * 24.0 * 512.0)
  111. #define FIST_M2606 (65536.0 * 65536.0 * 24.0 * 1024.0)
  112. #define FIST_M2705 (65536.0 * 65536.0 * 24.0 * 2048.0)
  113. #define FIST_M2804 (65536.0 * 65536.0 * 24.0 * 4096.0)
  114. #define FIST_M2903 (65536.0 * 65536.0 * 24.0 * 8192.0)
  115. #define FIST_M3002 (65536.0 * 65536.0 * 24.0 * 16384.0)
  116. #define FIST_M3101 (65536.0 * 65536.0 * 24.0 * 32768.0)
  117. #define FIST_SHORT (14680064.0f)
  118.  
  119.  
  120. /*
  121. The following ASM code will convert quickly from a floating point value
  122. to a 16.16 fixed point number.
  123.  
  124. This code comes complements of Chris Babcock (a.k.a. "VOR")
  125.  
  126.  
  127. i_bignum  dq        04238000000000000h
  128.  
  129. FADD   [i_bignum]
  130. ...
  131. FSTP  [qword ptr i_temp]
  132. ...
  133. MOV  eax,[dword ptr i_temp]   ; eax = 16.16
  134. */
  135.  
  136.  
  137. _QMATH_INLINE long qmathFtstNeg(float inval)
  138. {
  139.     return ((*(long *) &inval) > 0x80000000);
  140. }
  141.  
  142.  
  143. _QMATH_INLINE long qmathFtstPos(float inval)
  144. {
  145.     return ((*(long *) &inval) < 0x80000000);
  146. }
  147.  
  148.  
  149. _QMATH_INLINE long qmathFtstZero(float inval)
  150. {
  151.     return ((*(long *) &inval) + (*(long *) &inval));
  152. }
  153.  
  154.  
  155. _QMATH_INLINE long qmathFcompGreatThan(float invala, float invalb)
  156. {
  157.     return ((*(long *) &invala) > (*(long *) &invalb));
  158. }
  159.  
  160.  
  161. _QMATH_INLINE long qmathFcompLessThan(float invala, float invalb)
  162. {
  163.     return ((*(long *) &invala) < (*(long *) &invalb));
  164. }
  165.  
  166.  
  167. _QMATH_INLINE short qmathFistShort(float inval)
  168. {
  169.     float dtemp = FIST_SHORT + inval;
  170.  
  171.     return ((*(short *) &dtemp) & 0x1FFFFF);
  172. }
  173.  
  174.  
  175. _QMATH_INLINE long qmathFistLong(float inval)
  176. {
  177.     double dtemp = FIST_MAGIC + inval;
  178.  
  179.     return ((*(long *) &dtemp) - 0x80000000);
  180. }
  181.  
  182.  
  183. _QMATH_INLINE long qmathFist0131(float inval)
  184. {
  185.     double dtemp = FIST_M0131 + inval;
  186.  
  187.     return (*(long *) &dtemp);
  188. }
  189.  
  190.  
  191. _QMATH_INLINE long qmathFist0230(float inval)
  192. {
  193.     double dtemp = FIST_M0230 + inval;
  194.  
  195.     return (*(long *) &dtemp);
  196. }
  197.  
  198.  
  199. _QMATH_INLINE long qmathFist0329(float inval)
  200. {
  201.     double dtemp = FIST_M0329 + inval;
  202.  
  203.     return (*(long *) &dtemp);
  204. }
  205.  
  206.  
  207. _QMATH_INLINE long qmathFist0428(float inval)
  208. {
  209.     double dtemp = FIST_M0428 + inval;
  210.  
  211.     return (*(long *) &dtemp);
  212. }
  213.  
  214.  
  215. _QMATH_INLINE long qmathFist0527(float inval)
  216. {
  217.     double dtemp = FIST_M0527 + inval;
  218.  
  219.     return (*(long *) &dtemp);
  220. }
  221.  
  222.  
  223. _QMATH_INLINE long qmathFist0626(float inval)
  224. {
  225.     double dtemp = FIST_M0626 + inval;
  226.  
  227.     return (*(long *) &dtemp);
  228. }
  229.  
  230.  
  231. _QMATH_INLINE long qmathFist0725(float inval)
  232. {
  233.     double dtemp = FIST_M0725 + inval;
  234.  
  235.     return (*(long *) &dtemp);
  236. }
  237.  
  238.  
  239. _QMATH_INLINE long qmathFist0824(float inval)
  240. {
  241.     double dtemp = FIST_M0824 + inval;
  242.  
  243.     return (*(long *) &dtemp);
  244. }
  245.  
  246.  
  247. _QMATH_INLINE long qmathFist0923(float inval)
  248. {
  249.     double dtemp = FIST_M0923 + inval;
  250.  
  251.     return (*(long *) &dtemp);
  252. }
  253.  
  254.  
  255. _QMATH_INLINE long qmathFist1022(float inval)
  256. {
  257.     double dtemp = FIST_M1022 + inval;
  258.  
  259.     return (*(long *) &dtemp);
  260. }
  261.  
  262.  
  263. _QMATH_INLINE long qmathFist1121(float inval)
  264. {
  265.     double dtemp = FIST_M1121 + inval;
  266.  
  267.     return (*(long *) &dtemp);
  268. }
  269.  
  270.  
  271. _QMATH_INLINE long qmathFist1220(float inval)
  272. {
  273.     double dtemp = FIST_M1220 + inval;
  274.  
  275.     return (*(long *) &dtemp);
  276. }
  277.  
  278.  
  279. _QMATH_INLINE long qmathFist1319(float inval)
  280. {
  281.     double dtemp = FIST_M1319 + inval;
  282.  
  283.     return (*(long *) &dtemp);
  284. }
  285.  
  286.  
  287. _QMATH_INLINE long qmathFist1418(float inval)
  288. {
  289.     double dtemp = FIST_M1418 + inval;
  290.  
  291.     return (*(long *) &dtemp);
  292. }
  293.  
  294.  
  295. _QMATH_INLINE long qmathFist1517(float inval)
  296. {
  297.     double dtemp = FIST_M1517 + inval;
  298.  
  299.     return (*(long *) &dtemp);
  300. }
  301.  
  302.  
  303. _QMATH_INLINE long qmathFist1616(float inval)
  304. {
  305.     double dtemp = FIST_M1616 + inval;
  306.  
  307.     return (*(long *) &dtemp);
  308. }
  309.  
  310.  
  311. _QMATH_INLINE long qmathFist1715(float inval)
  312. {
  313.     double dtemp = FIST_M1715 + inval;
  314.  
  315.     return (*(long *) &dtemp);
  316. }
  317.  
  318.  
  319. _QMATH_INLINE long qmathFist1814(float inval)
  320. {
  321.     double dtemp = FIST_M1814 + inval;
  322.  
  323.     return (*(long *) &dtemp);
  324. }
  325.  
  326.  
  327. _QMATH_INLINE long qmathFist1913(float inval)
  328. {
  329.     double dtemp = FIST_M1913 + inval;
  330.  
  331.     return (*(long *) &dtemp);
  332. }
  333.  
  334.  
  335. _QMATH_INLINE long qmathFist2012(float inval)
  336. {
  337.     double dtemp = FIST_M2012 + inval;
  338.  
  339.     return (*(long *) &dtemp);
  340. }
  341.  
  342.  
  343. _QMATH_INLINE long qmathFist2111(float inval)
  344. {
  345.     double dtemp = FIST_M2111 + inval;
  346.  
  347.     return (*(long *) &dtemp);
  348. }
  349.  
  350.  
  351. _QMATH_INLINE long qmathFist2210(float inval)
  352. {
  353.     double dtemp = FIST_M2210 + inval;
  354.  
  355.     return (*(long *) &dtemp);
  356. }
  357.  
  358.  
  359. _QMATH_INLINE long qmathFist2309(float inval)
  360. {
  361.     double dtemp = FIST_M2309 + inval;
  362.  
  363.     return (*(long *) &dtemp);
  364. }
  365.  
  366.  
  367. _QMATH_INLINE long qmathFist2408(float inval)
  368. {
  369.     double dtemp = FIST_M2408 + inval;
  370.  
  371.     return (*(long *) &dtemp);
  372. }
  373.  
  374.  
  375. _QMATH_INLINE long qmathFist2507(float inval)
  376. {
  377.     double dtemp = FIST_M2507 + inval;
  378.  
  379.     return (*(long *) &dtemp);
  380. }
  381.  
  382.  
  383. _QMATH_INLINE long qmathFist2606(float inval)
  384. {
  385.     double dtemp = FIST_M2606 + inval;
  386.  
  387.     return (*(long *) &dtemp);
  388. }
  389.  
  390.  
  391. _QMATH_INLINE long qmathFist2705(float inval)
  392. {
  393.     double dtemp = FIST_M2705 + inval;
  394.  
  395.     return (*(long *) &dtemp);
  396. }
  397.  
  398.  
  399. _QMATH_INLINE long qmathFist2804(float inval)
  400. {
  401.     double dtemp = FIST_M2804 + inval;
  402.  
  403.     return (*(long *) &dtemp);
  404. }
  405.  
  406.  
  407. _QMATH_INLINE long qmathFist2903(float inval)
  408. {
  409.     double dtemp = FIST_M2903 + inval;
  410.  
  411.     return (*(long *) &dtemp);
  412. }
  413.  
  414.  
  415. _QMATH_INLINE long qmathFist3002(float inval)
  416. {
  417.     double dtemp = FIST_M3002 + inval;
  418.  
  419.     return (*(long *) &dtemp);
  420. }
  421.  
  422.  
  423. _QMATH_INLINE long qmathFist3101(float inval)
  424. {
  425.     double dtemp = FIST_M3101 + inval;
  426.  
  427.     return (*(long *) &dtemp);
  428. }
  429.  
  430.  
  431. // M_ constants
  432. #define M_E        (2.71828182845904523536)
  433. #define M_LOG2E    (1.44269504088896340736)
  434. #define M_LOG10E   (0.434294481903251827651)
  435. #define M_LN2      (0.693147180559945309417)
  436. #define M_LN10     (2.30258509299404568402)
  437. #define M_PI       (3.14159265358979323846)
  438. #define M_PI_2     (1.57079632679489661923)
  439. #define M_PI_4     (0.785398163397448309616)
  440. #define M_1_PI     (0.318309886183790671538)
  441. #define M_2_PI     (0.636619772367581343076)
  442. #define M_1_SQRTPI (0.564189583547756286948)
  443. #define M_2_SQRTPI (1.12837916709551257390)
  444. #define M_SQRT2    (1.41421356237309504880)
  445. #define M_SQRT_2   (0.707106781186547524401)
  446.  
  447.  
  448. _QMATH_NAKED _QMATH_INLINE
  449. double _QMATH_LINK qmathSin(double __x)
  450. {
  451.     __asm fld        qword ptr [esp + 4]
  452.     __asm fsin
  453.     __asm ret        8
  454. }
  455.  
  456.  
  457. static double einhalb = 0.5;
  458.  
  459. _QMATH_NAKED _QMATH_INLINE
  460. double _QMATH_LINK qmathAsin(double __x)
  461. {
  462.     __asm fld        qword ptr [esp + 4]
  463.     __asm fld        st
  464.     __asm fabs
  465.     __asm fcom        dword ptr [einhalb]
  466.     __asm fstsw        ax
  467.     __asm sahf
  468.     __asm jbe        asin_kleiner
  469.     __asm fld1
  470.     __asm fsubrp    st(1), st(0)
  471.     __asm fld        st
  472.     __asm fadd        st(0), st(0)
  473.     __asm fxch        st(1)
  474.     __asm fmul        st(0), st(0)
  475.     __asm fsubp        st(1), st(0)
  476.     __asm jmp        asin_exit
  477.  
  478. asin_kleiner:
  479.  
  480.     __asm fstp        st(0)
  481.     __asm fld        st(0)
  482.     __asm fmul        st(0), st(0)
  483.     __asm fld1
  484.     __asm fsubrp    st(1), st(0)
  485.  
  486. asin_exit:
  487.  
  488.     __asm fsqrt
  489.     __asm fpatan
  490.     __asm ret        8
  491. }
  492.  
  493.  
  494. _QMATH_NAKED _QMATH_INLINE
  495. double _QMATH_LINK qmathCos(double __x)
  496. {
  497.     __asm fld        qword ptr [esp + 4]
  498.     __asm fcos
  499.     __asm ret        8
  500. }
  501.  
  502.  
  503. _QMATH_NAKED _QMATH_INLINE
  504. double _QMATH_LINK qmathAcos(double __x)
  505. {
  506.     __asm fld        qword ptr [esp + 4]
  507.     __asm fld1
  508.     __asm fchs
  509.     __asm fcomp        st(1)
  510.     __asm fstsw        ax
  511.     __asm je        acos_suckt
  512.  
  513.     __asm fld        st(0)
  514.     __asm fld1
  515.     __asm fsubrp    st(1), st(0)
  516.     __asm fxch        st(1)
  517.     __asm fld1
  518.     __asm faddp        st(1), st(0)
  519.     __asm fdivp        st(1), st(0)
  520.     __asm fsqrt
  521.     __asm fld1
  522.     __asm jmp        acos_exit
  523.  
  524. acos_suckt:
  525.  
  526.     __asm fld1
  527.     __asm fldz
  528.  
  529. acos_exit:
  530.  
  531.     __asm fpatan
  532.     __asm fadd        st(0), st(0)
  533.     __asm ret        8
  534. }
  535.  
  536.  
  537. /* J.Bennett - added fstp in tan function to remove 1.0 it pushes onto the stack */
  538.  
  539. _QMATH_NAKED _QMATH_INLINE
  540. double _QMATH_LINK qmathTan(double __x)
  541. {
  542.     __asm fld        qword ptr [esp + 4]
  543.     __asm fptan
  544.     __asm fstp        st(0)
  545.     __asm ret        8
  546. }
  547.  
  548.  
  549. _QMATH_NAKED _QMATH_INLINE
  550. double _QMATH_LINK qmathAtan(double __x)
  551. {
  552.     __asm fld        qword ptr [esp + 4]
  553.     __asm fld1
  554.     __asm fpatan
  555.     __asm ret        8
  556. }
  557.  
  558.  
  559. _QMATH_NAKED _QMATH_INLINE
  560. double _QMATH_LINK qmathAtan2(double __y, double __x)
  561. {
  562.     __asm fld        qword ptr [esp +  4]
  563.     __asm fld        qword ptr [esp + 12]
  564.     __asm fpatan
  565.     __asm ret        16
  566. }
  567.  
  568.  
  569. _QMATH_NAKED _QMATH_INLINE
  570. double _QMATH_LINK qmathExp(double __x)
  571. {
  572.     __asm fld        qword ptr [esp + 4];
  573.     __asm fldl2e
  574.     __asm fmulp        st(1), st
  575.     __asm fld1
  576.     __asm fld        st(1)
  577.     __asm fprem
  578.     __asm f2xm1
  579.     __asm faddp        st(1), st
  580.     __asm fscale
  581.     __asm fxch
  582.     __asm fstp        st
  583.     __asm ret        8
  584. }
  585.  
  586.  
  587. _QMATH_NAKED _QMATH_INLINE
  588. double _QMATH_LINK qmathExp2(double __x)
  589. {
  590.     __asm fld        qword ptr [esp + 4];
  591.     __asm fld1
  592.     __asm fld        st(1)
  593.     __asm fprem
  594.     __asm f2xm1
  595.     __asm faddp        st(1), st
  596.     __asm fscale
  597.     __asm fxch
  598.     __asm fstp        st
  599.     __asm ret        8
  600. }
  601.  
  602.  
  603. _QMATH_NAKED _QMATH_INLINE
  604. double _QMATH_LINK qmathExp10(double __x)
  605. {
  606.     __asm fld        qword ptr [esp + 4];
  607.     __asm fldl2t
  608.     __asm fmulp        st(1), st
  609.     __asm fld1
  610.     __asm fld        st(1)
  611.     __asm fprem
  612.     __asm f2xm1
  613.     __asm faddp        st(1), st
  614.     __asm fscale
  615.     __asm fxch
  616.     __asm fstp        st
  617.     __asm ret        8
  618. }
  619.  
  620.  
  621. _QMATH_NAKED _QMATH_INLINE
  622. double _QMATH_LINK qmathLog(double __x)
  623. {
  624.     __asm fld        qword ptr [esp + 4]
  625.     __asm fldln2
  626.     __asm fxch
  627.     __asm fyl2x
  628.     __asm ret        8
  629. }
  630.  
  631.  
  632. _QMATH_NAKED _QMATH_INLINE
  633. double _QMATH_LINK qmathLog2(double __x)
  634. {
  635.     __asm fld        qword ptr [esp + 4]
  636.     __asm fld1
  637.     __asm fxch
  638.     __asm fyl2x
  639.     __asm ret        8
  640. }
  641.  
  642.  
  643. _QMATH_NAKED _QMATH_INLINE
  644. double _QMATH_LINK qmathLog10(double __x)
  645. {
  646.     __asm fld        qword ptr [esp + 4]
  647.     __asm fldlg2
  648.     __asm fxch
  649.     __asm fyl2x
  650.     __asm ret        8
  651. }
  652.  
  653.  
  654. _QMATH_NAKED _QMATH_INLINE
  655. double _QMATH_LINK qmathFabs(double __x)
  656. {
  657.     __asm fld        qword ptr [esp + 4]
  658.     __asm fabs
  659.     __asm ret        8
  660. }
  661.  
  662.  
  663. _QMATH_NAKED _QMATH_INLINE
  664. double _QMATH_LINK qmathPow(double __x, double __y)
  665. {
  666.     __asm fld        qword ptr [esp + 12]
  667.     __asm fld        qword ptr [esp +  4]
  668.     __asm ftst
  669.     __asm fstsw        ax
  670.     __asm sahf
  671.     __asm jz        pow_zero
  672.  
  673.     __asm fyl2x
  674.     __asm fld1
  675.     __asm fld        st(1)
  676.     __asm fprem
  677.     __asm f2xm1
  678.     __asm faddp        st(1), st(0)
  679.     __asm fscale
  680.  
  681. pow_zero:
  682.  
  683.     __asm fstp        st(1)
  684.     __asm ret        16
  685. }
  686.  
  687.  
  688. _QMATH_NAKED _QMATH_INLINE
  689. double _QMATH_LINK qmathCeil(double __x)
  690. {
  691.     __asm fld        qword ptr [esp + 4]
  692.     __asm fchs
  693.     __asm fld1
  694.     __asm fld        st(1)
  695.     __asm fprem
  696.     __asm sub        esp, 4
  697.     __asm fst        dword ptr [esp]
  698.     __asm fxch        st(2)
  699.     __asm mov        eax, [esp]
  700.     __asm cmp        eax, 0x80000000
  701.     __asm jbe        ceil_exit
  702.     __asm fsub        st, st(1)
  703.  
  704. ceil_exit:
  705.  
  706.     __asm fsub        st, st(2)
  707.     __asm fstp        st(1)
  708.     __asm fstp        st(1)
  709.     __asm fchs
  710.     __asm pop        eax
  711.     __asm ret        8
  712. }
  713.  
  714.  
  715. _QMATH_NAKED _QMATH_INLINE
  716. double _QMATH_LINK qmathFloor(double __x)
  717. {
  718.     __asm fld        qword ptr [esp + 4]
  719.     __asm fld1
  720.     __asm fld        st(1)
  721.     __asm fprem
  722.     __asm sub        esp, 4
  723.     __asm fst        dword ptr [esp]
  724.     __asm fxch        st(2)
  725.     __asm mov        eax, [esp]
  726.     __asm cmp        eax, 0x80000000
  727.     __asm jbe        floor_exit
  728.     __asm fsub        st, st(1)
  729.  
  730. floor_exit:
  731.  
  732.     __asm fsub        st, st(2)
  733.     __asm fstp        st(1)
  734.     __asm fstp        st(1)
  735.     __asm pop        eax
  736.     __asm ret        8
  737. }
  738.  
  739.  
  740. _QMATH_NAKED _QMATH_INLINE
  741. double _QMATH_LINK qmathFmod(double __x, double __y)
  742. {
  743.     __asm fld        qword ptr [esp + 12]
  744.     __asm fld        qword ptr [esp +  4]
  745.     __asm fprem
  746.     __asm fxch
  747.     __asm fstp        st
  748.     __asm ret        16
  749. }
  750.  
  751.  
  752. _QMATH_NAKED _QMATH_INLINE
  753. double _QMATH_LINK qmathSqrt(double __x)
  754. {
  755.     __asm fld        qword ptr [esp + 4]
  756.     __asm fsqrt
  757.     __asm ret        8
  758. }
  759.  
  760.  
  761. _QMATH_NAKED _QMATH_INLINE
  762. double _QMATH_LINK qmathHypot(double __x, double __y)
  763. {
  764.     __asm fld        qword ptr [esp + 12]
  765.     __asm fld        qword ptr [esp +  4]
  766.     __asm fmul        st, st
  767.     __asm fxch
  768.     __asm fmul        st, st
  769.     __asm faddp        st(1), st
  770.     __asm fsqrt
  771.     __asm ret        16
  772. }
  773.  
  774.  
  775. _QMATH_NAKED _QMATH_INLINE
  776. double _QMATH_LINK qmathAcosh(double __x)
  777. {
  778.     __asm fld        qword ptr [esp + 4]
  779.     __asm fld        st
  780.     __asm fmul        st, st
  781.     __asm fld1
  782.     __asm fsubp        st(1), st
  783.     __asm fsqrt
  784.     __asm faddp        st(1), st
  785.     __asm fldln2
  786.     __asm fxch
  787.     __asm fyl2x
  788.     __asm ret        8
  789. }
  790.  
  791.  
  792. _QMATH_NAKED _QMATH_INLINE
  793. double _QMATH_LINK qmathAsinh(double __x)
  794. {
  795.     __asm fld        qword ptr [esp + 4]
  796.     __asm fld        st
  797.     __asm fmul        st, st
  798.     __asm fld1
  799.     __asm faddp        st(1), st
  800.     __asm fsqrt
  801.     __asm faddp        st(1), st
  802.     __asm fldln2
  803.     __asm fxch
  804.     __asm fyl2x
  805.     __asm ret        8
  806. }
  807.  
  808.  
  809. _QMATH_NAKED _QMATH_INLINE
  810. double _QMATH_LINK qmathAtanh(double __x)
  811. {
  812.     __asm fld        qword ptr [esp + 4]
  813.     __asm fld1
  814.     __asm fsub        st, st(1)
  815.     __asm fld1
  816.     __asm faddp        st(2), st
  817.     __asm fdivrp    st(1), st
  818.     __asm fldln2
  819.     __asm fxch
  820.     __asm fyl2x
  821.     __asm mov        eax, 0xBF000000
  822.     __asm push        eax
  823.     __asm fld        dword ptr [esp]
  824.     __asm fmulp        st(1), st
  825.     __asm pop        eax
  826.     __asm ret        8
  827. }
  828.  
  829.  
  830. _QMATH_NAKED _QMATH_INLINE
  831. double _QMATH_LINK qmathCosh(double __x)
  832. {
  833.     __asm fld        qword ptr [esp + 4]
  834.     __asm fldl2e
  835.     __asm fmulp        st(1), st
  836.     __asm fld1
  837.     __asm fld        st(1)
  838.     __asm fprem
  839.     __asm f2xm1
  840.     __asm faddp        st(1), st
  841.     __asm fscale
  842.     __asm fxch
  843.     __asm fstp        st
  844.     __asm fld1
  845.     __asm fdiv        st, st(1)
  846.     __asm faddp        st(1), st
  847.     __asm mov        eax, 0x3F000000
  848.     __asm push        eax
  849.     __asm fld        dword ptr [esp]
  850.     __asm fmulp        st(1), st
  851.     __asm pop        eax
  852.     __asm ret        8
  853. }
  854.  
  855.  
  856. _QMATH_NAKED _QMATH_INLINE
  857. double _QMATH_LINK qmathSinh(double __x)
  858. {
  859.     __asm fld        qword ptr [esp + 4]
  860.     __asm fldl2e
  861.     __asm fmulp        st(1), st
  862.     __asm fld1
  863.     __asm fld        st(1)
  864.     __asm fprem
  865.     __asm f2xm1
  866.     __asm faddp        st(1), st
  867.     __asm fscale
  868.     __asm fxch
  869.     __asm fstp        st
  870.     __asm fld1
  871.     __asm fdiv        st, st(1)
  872.     __asm fsubp        st(1), st
  873.     __asm mov        eax, 0x3F000000
  874.     __asm push        eax
  875.     __asm fld        dword ptr [esp]
  876.     __asm fmulp        st(1), st
  877.     __asm pop        eax
  878.     __asm ret        8
  879. }
  880.  
  881.  
  882. _QMATH_NAKED _QMATH_INLINE
  883. double _QMATH_LINK qmathTanh(double __x)
  884. {
  885.     __asm fld        qword ptr [esp + 4]
  886.     __asm fld        st
  887.     __asm mov        eax, 0x40000000
  888.     __asm push        eax
  889.     __asm fld        dword ptr [esp]
  890.     __asm fmul        st, st(1)
  891.     __asm fldl2e
  892.     __asm fmulp        st(1), st
  893.     __asm fld1
  894.     __asm fld        st(1)
  895.     __asm fprem
  896.     __asm f2xm1
  897.     __asm faddp        st(1), st
  898.     __asm fscale
  899.     __asm fxch
  900.     __asm fstp        st
  901.     __asm fld1
  902.     __asm fsub        st, st(1)
  903.     __asm fchs
  904.     __asm fld1
  905.     __asm faddp        st(2), st
  906.     __asm fdivrp    st(1), st
  907.     __asm pop        eax
  908.     __asm ret        8
  909. }
  910.  
  911.  
  912. #ifdef __cplusplus
  913.   };
  914. #endif
  915.  
  916. #endif // _QUICKMATH_H_INCLUDED
  917.